package com.demo.alibaba.util;


/**
 * 邀请码生成器，算法原理：<br/>
 * 1) 获取手机号: 17628298180 <br/>
 * 2) 使用自定义52进制转为：QmKLe7 <br/>
 */
public class ShareCodeUtil {

    /** 自定义52进制(0,1没有加入,容易与o,l混淆) */
    private static final char[] r=new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x',
                                             '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j',
                                             'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6',
                                             'b', 'g', 'h', 'M', 'H', 'U', 'P', 'Y', 'A', 'N',
                                             'G', 'T', 'I', 'R', 'B', 'D', 'Q', 'E', 'F', 'L',
                                             'J', 'K'};
    /** 进制长度 */
    private static final int binLen=r.length;

    /**
     * 根据ID生成六位随机码
     * @param id ID
     * @return 随机码
     */
    public static String toSerialCode(long id) {
        char[] buf=new char[52];
        int charPos=52;

        while((id / binLen) > 0) {
            int ind=(int)(id % binLen);
            buf[--charPos]=r[ind];
            id /= binLen;
        }
        buf[--charPos]=r[(int)(id % binLen)];
        String str=new String(buf, charPos, (52 - charPos));
        return str;
    }

    public static long codeToId(String code) {
        char chs[]=code.toCharArray();
        long res=0L;
        for(int i=0; i < chs.length; i++) {
            int ind=0;
            for(int j=0; j < binLen; j++) {
                if(chs[i] == r[j]) {
                    ind=j;
                    break;
                }
            }
            if(i > 0) {
                res=res * binLen + ind;
            } else {
                res=ind;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(ShareCodeUtil.toSerialCode(Long.parseLong("17628298180")));
        System.out.println(ShareCodeUtil.toSerialCode(Long.parseLong("18508215424")));

        System.out.println(ShareCodeUtil.codeToId("QmKLe7"));
        System.out.println(ShareCodeUtil.codeToId("QmKLep"));
    }
}